import { BizUnit } from './bizUnit';
import { IBizUnitConfig, ModelObjType } from '../shared/types';
import logger from 'loglevel';

/**
 * 内置，基于模型的业务单元基类
 */
export abstract class ModelBizUnit extends BizUnit {
  abstract objType: ModelObjType; // 对象类型，用于表示模型对象的类型

  /**
   * 把模型数据更新到 mapbox 实例的source中
   */
  async updateGeoData(config: IBizUnitConfig): Promise<void> {
    if (!this.objType) {
      throw new Error('当前业务单元(BizUnit)未设置objType属性');
    }
    logger.debug(
      `开始更新业务单元 ${this.objType} 的地理数据, 已有参数，但是可能咩用, `,
      config,
    );
    const res = await this.engiGis.objectModelManager
      .getModelObjectGisInfoByType(this.objType)
      .catch(() => {
        return { data: [] };
      });
    let features: GeoJSON.Feature<
      GeoJSON.Geometry,
      GeoJSON.GeoJsonProperties
    >[] = [];
    if (!res || !res.data || !Array.isArray(res.data)) {
      logger.warn(`No valid features data found for ${this.objType}`);
      features = [];
    } else {
      features = res.data as GeoJSON.Feature<
        GeoJSON.Geometry,
        GeoJSON.GeoJsonProperties
      >[];
    }
    const clusterOptions: any = {};
    if (this.objType === 'substation') {
      clusterOptions['cluster'] = true;
      clusterOptions['clusterMaxZoom'] = 13; // 最大缩放级别
      clusterOptions['clusterRadius'] = 50; // 聚合半径
    }
    // console.log(`业务单元 ${this.objType} 的地理数据更新，features 数量: ${features.length}, 已配置cluster`);
    this.engiGis.addOrUpdateSource(this.sourceId, {
      type: 'geojson',
      data: {
        type: 'FeatureCollection',
        features,
      },
      ...clusterOptions,
    });
    logger.info(`业务单元 ${this.objType} 的地理数据更新完成`);
  }
}
